﻿using Sinacor.Infra.Common.Exceptions;
using System;
using Sinacor.Infra.UI.Common;

namespace Sinacor.UI.Bovespa.Contabil.Presenter
{
    /// <summary>
    /// Presenter Class - CadastroEventoContabil
    /// </summary>
    public class CadastroEventoContabil : BasePresenter<IBaseView>
    {
        #region Construtor

        /// <summary>
        /// Construtor
        /// </summary>
        /// <param name="view"></param>
        public CadastroEventoContabil(ICadastroEventoContabil view)
            : base((IBaseView)view)
        {
            this.view = view;
            this.ListaEventoContabil = new ModelCollection<Model.EventoContabil>();
        }

        #endregion

        #region Atributos

        private ICadastroEventoContabil view;
        private Communication.EventoContabil _communicationEventoContabil;
        private ModelCollection<Model.EventoContabil> _listaEventoContabil;

        #endregion

        #region Propriedades

        /// <summary>
        /// Lista de eventos contábeis
        /// </summary>
        public ModelCollection<Model.EventoContabil> ListaEventoContabil
        {
            get { return _listaEventoContabil; }
            set
            {
                _listaEventoContabil = value;                
            }
        }

        #endregion

        #region Métodos Públicos

        /// <summary>
        /// Validar evento Contabil
        /// </summary>
        /// <param name="model">Model.EventoContabil</param>
        /// <returns>bool</returns>
        public bool ValidarEventoContabil(Model.EventoContabil model)
        {
            if (string.IsNullOrEmpty(model.Descricao))
            {
                view.InformarDescricaoObrigatoria();
                return false;
            }
            return true;
        }

        /// <summary>
        /// Alterar evento contabil
        /// </summary>
        /// <param name="model">Model.EventoContabil</param>
        /// <returns>bool</returns>
        public bool AlterarEventoContabil(Model.EventoContabil model)
        {
            bool retorno = false;

            if (this.ValidarEventoContabil(model))
            {
                try
                {
                    this._communicationEventoContabil = new Communication.EventoContabil(this.Session);
                    this._communicationEventoContabil.AlterarEventoContabil(model);
                    this.ListaEventoContabil.ClearChanges();
                    this.view.InformarAlteracaoSucesso();
                    this.view.AtualizarEventoContabil();

                    retorno = true;
                }
                catch (Exception ex)
                {
                    base.HandleException(ex, ErrorLevel.Critical);
                    this.AtribuirFoco(((BusinessException)(ex)).ErrorNumber);         
                }
                finally 
                {
                    this._communicationEventoContabil = null;
                }
            }

            return retorno;
        }

        /// <summary>
        /// Consultar eventos contabeis
        /// </summary>
        public void ConsultarEventosContabeis()
        {
            try
            {
                this._communicationEventoContabil = new Communication.EventoContabil(this.Session);
                this.ListaEventoContabil = this._communicationEventoContabil.ConsultarEventosContabeis(new Sinacor.UI.Bovespa.Contabil.Model.Parameter.FiltroEventoContabil());

                if (this.ListaEventoContabil.Count < 1)
                    this.view.InformarNaoExistemDadosCadastrado();

                this.view.AtualizarEventoContabil();
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
            finally
            {
                this._communicationEventoContabil = null;
            }
        }

        /// <summary>
        /// Excluir evento contábil 
        /// </summary>
        /// <param name="model">Model.EventoContabil</param>
        /// <returns>bool</returns>
        public bool ExcluirEventoContabil(Model.EventoContabil model)
        {            
            Model.Parameter.FiltroEventoContabilChave filtroEventoContabilChave;
            bool resultado = false;
            try
            {
                filtroEventoContabilChave = new Model.Parameter.FiltroEventoContabilChave();
                filtroEventoContabilChave.Codigo = model.Codigo.Value;

                this._communicationEventoContabil = new Communication.EventoContabil(this.Session);
                this._communicationEventoContabil.ExcluirEventoContabil((filtroEventoContabilChave));

                this.view.InformarExclusaoSucesso();
                this.view.AtualizarEventoContabil();
                resultado = true;
            }
            catch (Exception ex)
            {
                resultado = false;
                HandleException(ex);
            }
            finally
            {
                filtroEventoContabilChave = null;
                this._communicationEventoContabil = null;
            }

            return resultado;
        }

        /// <summary>
        /// Incluir evento contabil
        /// </summary>
        /// <param name="model">Model.EventoContabil</param>
        public bool IncluirEventoContabil(Model.EventoContabil model)
        {
            bool resultado = false;
            if (model.Codigo < 1)
                this.view.InformarCodigoObrigatorio();
            else
            {
                if (this.ValidarEventoContabil(model))
                {
                    try
                    {
                        this._communicationEventoContabil = new Communication.EventoContabil(this.Session);
                        this._communicationEventoContabil.IncluirEventoContabil(model);
                        this.ListaEventoContabil.ClearChanges();
                        this.view.InformarInclusaoSucesso();
                        this.view.AtualizarEventoContabil();
                        resultado = true;
                    }
                    catch (Exception ex)
                    {   
                        base.HandleException(ex, ErrorLevel.Critical);
                        this.AtribuirFoco(((BusinessException)(ex)).ErrorNumber);                           
                    }
                    finally
                    {
                        this._communicationEventoContabil = null;
                    }
                }
            }
            return resultado;
        }

        /// <summary>
        /// Inicializar
        /// </summary>
        public void Inicializar()
        {
            this.ConsultarEventosContabeis();
        }

        /// <summary>
        /// Atribui o foco no controle correto na View
        /// </summary>
        /// <param name="codigoException">Código da Exception</param>
        public void AtribuirFoco(int codigoException)
        {
            if (codigoException == 109198)
                this.view.AtribuirFocoCodigo();
            else if (codigoException == 109340 || codigoException == 109193)
                this.view.AtribuirFocoDescricao();
        }

        #endregion
    }
}